package org.dromara.demo.designPattern.ocp.service.impl;

import org.dromara.demo.designPattern.ocp.service.ICalculationArea;

/**
 *开闭原则模拟场景 : 如果用户想要更精确圆的面设计, 不遵守开闭原则的,就是直接修改 π, 这样会影响原有的实现业务代码, 增加测试工作量, 违背了开闭原则.
 * 遵守开闭原则的做法, 应该是集成CalculationArea对象,重写 CalculationArea对象, 增加圆形面积的计算方法.
 */
public class CalculationArea implements ICalculationArea {

    private final static double π = 3.14D;
    @Override
    public double rectangle(double x, double y) {
        return x*y;
    }

    @Override
    public double triangle(double x, double y, double z) {
        double p = (x + y + z) / 2;
        return Math.sqrt(p * (p - x) * (p - y) * (p - z));
    }

    @Override
    public double circular(double r) {
        return π * r * r;
    }
}
